#!/bin/bash

# $Date: 2010-09-01 12:00:15 -0300 (Wed, 01 Sep 2010) $
# $Revision: 1305 $

# Usé "Advanced Bash-Scripting Guide" http://tldp.org/LDP/abs/html/

TIMES=128

die()
{
	echo "Falló!"
	exit 1
}


# \BeginSección{getattr, mknod, unlink, rename}
echo "#Pruebas básicas: getattr, mknod, unlink, rename"

echo "  Crear $0.tmp"
touch $0.tmp || die

echo "  $0.tmp está"
ls $0.tmp >/dev/null || die

echo "  Cambiamos el nombre de $0.tmp a $0.tmp.tmp"
mv $0.tmp $0.tmp.tmp || die

echo "  $0.tmp no está"
ls $0.tmp >/dev/null 2>/dev/null && die

echo "  Borrar el archivo $0.tmp.tmp"
rm $0.tmp.tmp || die

echo "  $0.tmp.tmp no está"
ls $0.tmp.tmp >/dev/null 2>/dev/null && die


echo "  Crear archivos [0,$TIMES)"
i=0
while [ "$i" -lt "$TIMES" ]
do
	touch $i || die
	let i=i+1
done

echo "  Ver que hay archivos [0,$TIMES)"
i=0
while [ "$i" -lt "$TIMES" ]
do
	ls $i >/dev/null || die
	let i=i+1
done

echo "  Borrar archivos [0,$TIMES)"
i=0
while [ "$i" -lt "$TIMES" ]
do
	rm $i || die
	let i=i+1
done

echo "##Pruebas al 40%"
# \EndSección{getattr, mknod, unlink, rename}


# \BeginSección{read, write, rename}
echo "#Pruebas de consistencia read, write y fortalecimiento de rename"

echo "  Copiar el kernel de Linux `uname -r`"
cp /boot/vmlinuz-`uname -r` . || die

echo "  Comparar el original con la copia"
diff /boot/vmlinuz-`uname -r` vmlinuz-`uname -r`
# No lo borro.

echo "  Renombrando el kernel de Linux"
mv vmlinuz-`uname -r` vmlinuz-`uname -r`moved || die

echo "  Escribiendo sobre el archivo renombrado para asegurar que se mantenga la consistencia"
cat /boot/vmlinuz-`uname -r` > ./vmlinuz-`uname -r`moved || die

echo "  Comparando que la copia tenga la misma informacion que la original"
diff /boot/vmlinuz-`uname -r` vmlinuz-`uname -r`moved || die

echo "  Devolviendo el kernel a su nombre original"
mv vmlinuz-`uname -r`moved vmlinuz-`uname -r` || die

echo "  Bajar linux-1.0.tar.bz2"
wget http://www.kernel.org/pub/linux/kernel/v1.0/linux-1.0.tar.bz2 >/dev/null 2>/dev/null || die

echo "  Descompresión"
bunzip2 linux-1.0.tar.bz2 || die
# No borro ni el descomprimido

echo "##Pruebas al 70%"
# \EndSección{read, write, rename}


# \BeginSección{metadatos}
echo "#Pruebas de consistencia de metadatos"

echo "  Creamos $0.tmp"
cp $0 $0.tmp || die

echo "  El dueño no es el uid/gid"
uid=`stat -c "%u" $0.tmp`
gid=`stat -c "%g" $0.tmp`
if [ "$uid" != "$UID" ] || [ "$gid" != "$GROUPS" ]; then
	die
fi

echo "  Los tiempos no son 0"
if [ `stat -c "%X" $0.tmp` = 0 ] || [ `stat -c "%Y" $0.tmp` = 0 ] || [ `stat -c "%Z" $0.tmp` = 0 ]; then
	die
fi

echo "  Si toco $0.tmp y espero 1 segundo, el tiempo de Modificación, Acceso y Cambio avanzan"
atime=`stat -c "%X" $0.tmp`
mtime=`stat -c "%Y" $0.tmp`
ctime=`stat -c "%Z" $0.tmp`
sleep 1
touch $0.tmp
if [ `stat -c "%X" $0.tmp` -le "$atime" ] || [ `stat -c "%Y" $0.tmp` -le "$mtime" ] || [ `stat -c "%Z" $0.tmp` -le "$ctime" ]; then
	die
fi

echo "  Si leo $0.tmp el tiempo de Acceso avanza"
#falsos negativos con mount -o noatime
atime=`stat -c "%X" $0.tmp`
sleep 1
cat $0.tmp >/dev/null
if [ `stat -c "%X" $0.tmp` -le "$atime" ]; then
	die
fi

echo "  Hago chmod de $0.tmp y el tiempo de Cambio avanza"
touch $0.tmp
ctime=`stat -c "%Z" $0.tmp`
sleep 1
chmod 777 $0.tmp
if [ `stat -c "%Z" $0.tmp` -le "$ctime" ]; then
	die
fi
chmod 644 $0.tmp

echo "  Hago chown de $0.tmp y el tiempo de Cambio avanza"
touch $0.tmp
ctime=`stat -c "%Z" $0.tmp`
sleep 1
#supongo que estas variables de entorno están bien definidas
chown $UID:$GROUPS $0.tmp
if [ `stat -c "%Z" $0.tmp` -le "$ctime" ]; then
	die
fi

# Lo borro, ya no lo necesito más
rm $0.tmp

echo "  Hago truncate de $0.tmp y los tiempos de Cambio y Modificación no cambian"
touch $0.tmp
mtime=`stat -c "%Y" $0.tmp`
ctime=`stat -c "%Z" $0.tmp`
truncate --size `stat -c "%s" $0.tmp` $0.tmp
if [ `stat -c "%Y" $0.tmp` -ne "$mtime" ] && [ `stat -c "%Z" $0.tmp` -ne "$ctime" ]; then
	die
fi


echo "##Pruebas al 90%"
# \EndSección{metadatos}


# \BeginSección{misceláneas}
echo "#Pruebas misceláneas"

echo "  Borro vmlinuz-`uname -r`"
rm vmlinuz-`uname -r` || die

echo "  Copio linux-1.0.tar a vmlinuz-`uname -r` con --sparse=never"
cp --sparse=never linux-1.0.tar vmlinuz-`uname -r` || die

echo "  Comparo linux-1.0.tar a vmlinuz-`uname -r`"
diff linux-1.0.tar vmlinuz-`uname -r` || die

# Agradecimientos: Federico Heinz y Charly Bederián. 
echo "  Copio linux-1.0.tar a vmlinuz-`uname -r` con --sparse=always"
cp --sparse=always linux-1.0.tar vmlinuz-`uname -r` || die

echo "  Comparo nuevamente linux-1.0.tar a vmlinuz-`uname -r`"
diff linux-1.0.tar vmlinuz-`uname -r` || die

# Agradecimientos: self.name
echo "  Compilo y ejecuto un programa que dice \"hola mundo\""
cat << EOF > hola.c
#include <stdio.h>
int main ()
{
  printf("hola mundo");
  return 0;
}
EOF
cc -o hola hola.c
./hola | grep "hola mundo" >/dev/null || die
rm hola hola.c || die

echo "##Shooting Down 100%"
# \EndSección{misceláneas}


echo "##MIDWAY, LAST 31 STAGE"
exit 0
